"use strict";
// interface是一种定义结构的方式，主要作用是为：类、对象、函数等规定一种契约，这样可以确保代码的一致性和类型安全，
// 但是要注意interface只能定义格式，不能包含任何实现！
// 用关键字implements去实现PersonInterface接口，格式： classs aaa implements aaaInterface
class IPerson {
    // 定义类的时候需要用implements关键字
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    speak(n) {
        for (let i = 0; i < n; i++) {
            console.log(`我是${this.name},我今年${this.age}岁了！`);
        }
    }
}
const iperson = new IPerson('夜南', 26);
iperson.speak(4);
// 对象去实现UserInfoInterface类型时，不需要加implements关键字，但是变量名和接口名中间有"："  格式为 aaa:aaaInterface
const iuserinfo = {
    // 这里的UserInfoInterface相当于是当类型用了，比如 const aaa :number = 111
    // 而UserInfoInterface相当于变成了type自定义的类型了
    name: '夜南漫剪',
    gender: '男',
    age: 18,
    run(n) {
        console.log(`夜南漫剪第${n}次学习typescript`);
    }
};
const icount = (x, y) => {
    // 这里的CountInterface相当于是当类型用了
    // 而CountInterface相当于变成了type自定义的类型了
    return x + y;
};
const stu = {
    name: 'Dear、夜溪',
    age: 18,
    grade: '四年级'
};
// 当两个接口名重复时，不会像JS那样进行覆盖，而是会合并
const mytestoner = {
    name: '张三',
    age: 18,
    grade: '一年级'
};
// 总结：何时使用接口
// 1、定义对象的格式：描述数据模型、API相应格式、配置对象....等等，是开发中用的最多的场景
// 2、类的契约:规定一个类需要实现哪些属性和方法
// 3、自动合并:一般用于扩展第三方库的类型,这种特性在大型项目中可能会用到
